package fr.umlv.ig.model;

import java.awt.Point;
import java.util.Map;

import fr.umlv.ig.listener.StationListener;


/**
 * Represents a model for a Station
 * @author Jenseric Catbgan
 * @author William Choy
 *
 */
public interface StationModel {

	/**
	 * Returns the Point which represents the Coordinate a the station.
	 * @param station A station. 
	 * @return the Point which represents the Coordinate a the station.
	 */
	public Point getCoordinate(Station station);
	
	/**
	 * Returns the coordinate X of the station.
	 * @param station the Station.
	 * @return the coordinate X of the station.
	 */
	public int getX(Station station);
	
	/**
	 * Returns the coordinate Y of the station.
	 * @param station the Station.
	 * @return the coordinate Y of the station.
	 */
	public int getY(Station station);
	
	/**
	 * Returns the waiting time of a station.
	 * @param station the Station.
	 * @return the waiting time of a station.
	 */
	public int getWaitingTime(Station station);
	
	/**
	 * Returns the waiting time between a station and another.
	 * @param station 
	 * 		  the first station.
	 * 		  
	 * @param nextStation
	 * 		  the Second Station	
	 * @return the wainting time between a station and another.
	 */
	public int getWaitingTime(Station station, Station nextStation);
	
	/**
	 * Returns the next Station of a station considered a direction.
	 * @param station 
	 *        the station.
	 * @param direction
	 *        the direction. 
	 * @return the next Station after the station on parameter.
	 */
	public Station getNextStation(Station station , Station direction);
	
	/**
	 * Returns a Map of every next stations after the station on parameter.
	 * @param station the station. 
	 * @return a Map of every next stations after the station on parameter.
	 */
	public Map<Station,Station> getMapNextStations(Station station);
	
	/**
	 * Returns true if the station is opened else it returns false.
	 * @param station the station.
	 * @return true if the station is opened else it returns false.
	 */
	public boolean isOpened(Station station);
	
	/**
	 * Returns true if the station is selected else it returns false;
	 * @param station the station.
	 * @return true if the station is selected else it returns false;
	 */
	public boolean isSelected(Station station);
	
	/**
	 * Adds a {@link StationListener} to the model.
	 * @param listener the {@link StationListener} to be added.
	 */  
	public void addStationListener(StationListener listener);
	
	/**
	 * Removes a {@link StationListener} to the model.
	 * @param listener the {@link StationListener} to be removed.
	 */
	public void removeStationListener(StationListener listener);
	
	
	
}
